package model.dba;

import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;

import model.Alumno;
import model.Clase;
import model.Cursada;
import model.Curso;
import model.Empresa;
import model.Estado_Cursada;
import model.Evaluacion;
import model.Horario;
import model.Instructor;
import model.Sala;

public class CursadaDAO extends JDBC {
	private static CursadaDAO cursadaDAO;

	private CursadaDAO() {
		super();
	}

	public static CursadaDAO getInstance() {
		if (cursadaDAO == null) {
			cursadaDAO = new CursadaDAO();
		}
		return cursadaDAO;
	}

	public int add(Cursada cursada) {

		try {
			String queryString = "INSERT INTO cursadas( fechainicio, fechainicioincripcion, cantclases, horassemanales, idcurso)" + " VALUES(?, ?, ?, ?, ?) ";
			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setTimestamp(1, new Timestamp(cursada.getFechaInicioCursada().getTimeInMillis()));
			preparedStatement.setTimestamp(2, new Timestamp(cursada.getFechaInicioInscripcion().getTimeInMillis()));
			preparedStatement.setInt(3, cursada.getCantidadClases());
			preparedStatement.setInt(4, cursada.getHorasSemanales());
			preparedStatement.setInt(5, cursada.getCurso().getId());

			preparedStatement.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (preparedStatement != null)
					preparedStatement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

		return getLastId();

	}

	public boolean update(Cursada cursada) {
		boolean state = false;
		try {
			String queryString = "UPDATE cursadas SET  fechainicio=?, fechafin=?, fechainicioincripcion=?, fechafininscripcion=?, horassemanales=?, cantclases=?, vacantes=?, cupominimo=?, idcurso=?, estado=?  WHERE idcursada=?";

			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setTimestamp(1, new Timestamp(cursada.getFechaInicioCursada().getTimeInMillis()));
			preparedStatement.setTimestamp(2, new Timestamp(cursada.getFechaFinCursada().getTimeInMillis()));
			preparedStatement.setTimestamp(3, new Timestamp(cursada.getFechaInicioInscripcion().getTimeInMillis()));
			preparedStatement.setTimestamp(4, new Timestamp(cursada.getFechaFinInscripcion().getTimeInMillis()));
			preparedStatement.setInt(5, cursada.getHorasSemanales());
			preparedStatement.setInt(6, cursada.getCantidadClases());
			preparedStatement.setInt(7, cursada.getVacantes());
			preparedStatement.setInt(8, cursada.getCupoMinimo());
			preparedStatement.setInt(9, cursada.getCurso().getId());
			preparedStatement.setString(10, cursada.getEstado().toString());

			state = preparedStatement.executeUpdate() != 0 ? true : false;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (preparedStatement != null)
					preparedStatement.close();
			}

			catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();

			}
		}
		return state;
	}

	public boolean delete(Cursada cursada) {
		boolean state = false;
		try {
			String queryString = "DELETE FROM cursadas WHERE idcursada=?";

			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setInt(1, cursada.getId());
			state = preparedStatement.executeUpdate() != 0 ? true : false;

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (preparedStatement != null)
					preparedStatement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
		return state;

	}

	public Cursada getCursada(int id) {

		Cursada cursada = new Cursada();
		try {
			String queryString = "SELECT * FROM cursadas where idcursada = '" + id + "';";

			preparedStatement = connection.prepareStatement(queryString);
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {
				cursada = populate();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (resultSet != null)
					resultSet.close();
				if (preparedStatement != null)
					preparedStatement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
		return cursada;
	}

	public int getLastId() {
		int ret = 0;
		try {
			String queryString = "SELECT idcursada FROM cursadas order by idcursada DESC LIMIT 1  ";

			preparedStatement = connection.prepareStatement(queryString);
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {
				ret = resultSet.getInt("idcursada");

			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (resultSet != null)
					resultSet.close();
				if (preparedStatement != null)
					preparedStatement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

		return ret;

	}

	public boolean changeEstado(Cursada cursada) {
		boolean state = false;
		try {
			String queryString = "UPDATE cursadas SET  estado=?  WHERE idcursada=?";
			preparedStatement = connection.prepareStatement(queryString);
			preparedStatement.setString(1, cursada.getEstado().toString());
			preparedStatement.setInt(2, cursada.getId());

			state = preparedStatement.executeUpdate() != 0 ? true : false;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (preparedStatement != null)
					preparedStatement.close();
			}

			catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();

			}
		}
		return state;
	}

	public List<Cursada> getAll() {
		List<Cursada> cursadaList = new ArrayList<Cursada>();

		try {
			String queryString = "SELECT * FROM cursadas  ;";

			preparedStatement = connection.prepareStatement(queryString);
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {

				cursadaList.add(populate());
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (resultSet != null)
					resultSet.close();
				if (preparedStatement != null)
					preparedStatement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
		return cursadaList;
	}

	private Cursada populate() throws SQLException {

		Cursada cursada = new Cursada();

		AlumnoDAO alumnoDAO = AlumnoDAO.getInstance();
		List<Alumno> alumnos = null;// TODO cargar alumnos de la cursada
		cursada.setAlumnos(alumnos);

		cursada.setCantidadClases((int) resultSet.getLong("cantClases"));

		ClaseDAO claseDAO = ClaseDAO.getInstance();
		List<Clase> clases = null;

		cursada.setClases(clases);
		cursada.setCupoMinimo((int) resultSet.getLong("cupominimo"));

		CursoDAO cursoDAO = CursoDAO.getInstance();
		Curso curso = cursoDAO.get(new Integer((int) resultSet.getLong("idcurso")));
		cursada.setCurso(curso);
		Empresa empresa = null;// TODO insertar empresa
		cursada.setEmpresa(empresa);
		cursada.setEstado(Estado_Cursada.valueOf(resultSet.getString("estado")));// estado estaba mal puesto

		List<Evaluacion> evaluaciones = null;// ----------------------------------------------------------------------------------
		cursada.setEvaluaciones(evaluaciones);

		GregorianCalendar fechas = new GregorianCalendar();
		if (resultSet.getTimestamp("fechafin") != null) {
			fechas.setTime(resultSet.getTimestamp("fechafin"));
			cursada.setFechaFinCursada(fechas);
		}

		GregorianCalendar fechasFinInscripcion = new GregorianCalendar();
		if (resultSet.getTimestamp("fechafininscripcion") != null) {
			fechasFinInscripcion.setTime(resultSet.getTimestamp("fechafininscripcion"));
			cursada.setFechaFinInscripcion(fechasFinInscripcion);
		}
		GregorianCalendar fechasInicioCursada = new GregorianCalendar();
		if (resultSet.getTimestamp("fechainicio") != null) {
			fechasInicioCursada.setTime(resultSet.getTimestamp("fechainicio"));
			cursada.setFechaInicioCursada(fechasInicioCursada);

		}

		GregorianCalendar fechasInicioInscripcion = new GregorianCalendar();
		fechasInicioInscripcion.setTime(resultSet.getTimestamp("fechainicioincripcion"));
		if (resultSet.getTimestamp("fechainicioincripcion") != null) {
			cursada.setFechaInicioInscripcion(fechasInicioInscripcion);
		}
		List<Horario> horarios = null;// TODO CARGAR HORARIOS
		cursada.setHorarios(horarios);
		cursada.setHorasSemanales((int) resultSet.getLong("horassemanales"));
		cursada.setId((int) resultSet.getLong("idcursada"));
		Instructor instructor = null;// TODO CARGAR INSTRUCTORES
		cursada.setInstructor(instructor);
		Sala sala = null;// TODO CARGAR SALAS
		cursada.setSala(sala);
		cursada.setVacantes((int) resultSet.getLong("vacantes"));

		return cursada;

	}
}